#include <stdio.h>   // 包含标准I/O函数（如printf、gets等）的头文件
#include <string.h>  // 包含字符串处理函数（如strstr、strcat等）的头文件
#include <stdlib.h>  // 包含内存分配函数（如malloc、free等）的头文件

/**
 * 将字符串中的所有大写字母转换为小写字母
 * @param str 要转换的字符串指针
 * @return 转换后的字符串指针（与输入指针相同，原地修改）
 */
char* strlwr1(char* str)
{
    char* str2 = str;  // 保存原始字符串地址，用于最终返回
    // 遍历字符串直到遇到结束符'\0'
    while (*str2 != '\0')
    {
        // 判断当前字符是否为大写字母
        if( *str2 >= 'A' && *str2 <= 'Z')
            *str2 += 0x20;  // 大写转小写（ASCII码差值为32，即0x20）
        str2++;  // 移动到下一个字符
    }
    return str;  // 返回原始字符串地址
}

/**
 * 在字符串s1中查找字符串s2最后一次出现的位置，并统计出现次数
 * @param s1 被查找的主字符串
 * @param s2 要查找的子字符串
 * @return 子字符串最后一次出现的起始地址，若未找到则返回NULL
 */
char* my_strrstr(char* s1, char* s2)
{
    char* last;    // 用于记录子字符串最后一次出现的位置
    char* current; // 用于记录当前找到的子字符串位置
    last = NULL;   // 初始化最后出现位置为NULL（未找到状态）
    int count = 0, pos;  // count统计出现次数，pos记录第一次出现的位置
    
    // 只有当子字符串s2不为空时才进行查找
    if (*s2 != '\0')
    {
        // 第一次查找s2在s1中出现的位置
        current = strstr(s1, s2);
        // 循环查找所有出现的位置，直到找不到为止
        while (current != NULL)
        {
            last = current;  // 更新最后出现的位置
            // 从当前位置的下一个字符开始继续查找
            current = strstr(last + 1, s2);
            count++;  // 累加出现次数
            // 记录第一次出现的位置（相对于s1的偏移量）
            if (count == 1)
                pos = last - s1;
        }
    }
    
    // 根据查找结果输出信息
    if (last != NULL)
        printf("%d %d", count, pos);  // 找到时输出次数和第一次出现的位置
    else
        printf("-1");  // 未找到时输出-1
    
    return last;  // 返回最后一次出现的位置
}

int main()
{
    // 分配一个较大的内存空间（10000000字节）用于存储主字符串
    char *s1 = (char *)malloc(10000000);
    if (s1 == NULL)  // 检查内存分配是否成功
        return 0;
    
    s1[0] = ' ';  // 在主字符串开头添加一个空格
    char s2[20] = " ";  // 子字符串初始化为包含一个空格
    
    // 读取用户输入的子字符串（从s2[1]开始存储，保留开头的空格）
    gets(s2 + 1);
    // 读取用户输入的主字符串（从s1[1]开始存储，保留开头的空格）
    gets(s1 + 1);
    
    // 在主字符串末尾添加一个空格
    strcat(s1, " ");
    // 在子字符串末尾添加一个空格
    strcat(s2, " ");
    
    // 将主字符串和子字符串都转换为小写字母（统一大小写，实现不区分大小写的查找）
    strlwr1(s1);
    strlwr1(s2);
    
    // 调用自定义函数查找子字符串在主字符串中最后出现的位置
    my_strrstr(s1, s2);
    
    // 释放动态分配的内存，避免内存泄漏
    free(s1);
    
    return 0;
}